package com.example.design.singleton;

/**
 * 恶汉模式
 * 类加载到内存后，就会实例化一个实例，JVM保证线程安全
 * 简单实用，推荐使用
 * 唯一缺点：不管用到与否，类装载时就会完成实例化
 * （话说：你不使用，你装载它干啥，净浪费内存）
 */
public class Singleton1 {
    private static final Singleton1 instance = new Singleton1();
    private Singleton1() {}
    public static Singleton1 getInstance() {
        return instance;
    }
    public void m() {
        // ...
    }
}

// 静态代码块
class Singleton1U {
    private static final Singleton1U instance;
    static {
        instance = new Singleton1U();
    }
    private Singleton1U() {}

    public static Singleton1U getInstance() {
        return instance;
    }
    public void m() {
        // ...
    }
}

class TestSingleton1 {
    public static void main(String[] args) {
        // 私有构造函数，无法使用 new 创建该类的实例
        //Singleton1 s1 = new Singleton1();
        Singleton1 s2 = Singleton1.getInstance();
        Singleton1 s3 = Singleton1.getInstance();
        // 验证获取到的是同一个实例
        System.out.println(s2 == s3);
    }
}
